Skip to content

Guarantee alignment of fixed-width integer primitives#2205

Open
joshlf wants to merge 4 commits intorust-lang:masterfrom
joshlf:patch-11
Open

Guarantee alignment of fixed-width integer primitives#2205
joshlf wants to merge 4 commits intorust-lang:masterfrom
joshlf:patch-11

Conversation

@joshlf
Copy link
Contributor

@joshlf joshlf commented Mar 11, 2026

Follows up on #2200 (comment)

As an optional extension, we could consider guaranteeing equality between the alignments of:

  • u32 and char
  • u32 and f32
  • u64 and f64

Those equalities strike me as less important, and I'm not sure if they're even valid (ie, whether they hold on all platforms).

@rustbot rustbot added the S-waiting-on-review Status: The marked PR is awaiting review from a maintainer label Mar 11, 2026
@traviscross traviscross added T-lang Relevant to the language team. I-lang-nominated Nominated for discussion during a lang team meeting. P-lang-drag-1 Lang team prioritization drag level 1. I-lang-radar Items that are on lang's radar and will need eventual work or consideration. labels Mar 11, 2026
@traviscross
Copy link
Contributor

traviscross commented Mar 11, 2026

Thanks. I pushed a clarification and separated out the rules.

Clearly we want to guarantee this for fixed-width integers of the same size.

@rfcbot fcp merge lang

@rust-rfcbot
Copy link
Collaborator

rust-rfcbot commented Mar 11, 2026

Team member @traviscross has proposed to merge this. The next step is review by the rest of the tagged team members:

No concerns currently listed.

Once a majority of reviewers approve (and at most 2 approvals are outstanding), this will enter its final comment period. If you spot a major issue that hasn't been raised at any point in this process, please speak up!

cc @rust-lang/lang-advisors: FCP proposed for lang, please feel free to register concerns.
See this document for info about what commands tagged team members can give me.

The alignment of primitives is platform-specific. In most cases, their alignment is equal to their size, but it may be less. In particular, `i128` and `u128` are often aligned to 4 or 8 bytes even though their size is 16, and on many 32-bit platforms, `i64`, `u64`, and `f64` are only aligned to 4 bytes, not 8.

r[layout.primitive.integer-alignment]
Alignment is guaranteed to be the same for signed and unsigned integer variants of the same size --- that is, for a given size `N`, `align_of::<uN>() == align_of::<iN>()`.
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would reword "of the same size" to something else. otherwise it sounds like u64 and usize must have the same alignment on 64-bit platforms.

Copy link
Contributor

@traviscross traviscross Mar 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alignment is guaranteed to be the same for fixed-width signed and unsigned integer variants of the same indicated size --- that is, for a given size N, align_of::<uN>() == align_of::<iN>().

How about that?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you want to cover usize/isize too?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about this?

The following pairs of types have the same alignment:

  • u8 and i8
  • u16 and i16
  • u32 and i32
  • u64 and i64
  • u128 and i128
  • usize and isize

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What about this?

The alignment of primitives is platform-specific. In most cases, their alignment is equal to their size, but it may be less. In particular, i128 and u128 are often aligned to 4 or 8 bytes even though their size is 16, and on many 32-bit platforms, i64, u64, and f64 are only aligned to 4 bytes, not 8.

Furthermore, it is guaranteed that:

  • u8 and i8 have the same alignment.
  • u16 and i16 have the same alignment.
  • u32 and i32 have the same alignment.
  • u64 and i64 have the same alignment.
  • u128 and i128 have the same alignment.
  • usize and isize have the same alignment.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Probably at that point, then, I wonder whether we should be revising the table above to include this somehow rather than reiterating all of the the primitive types again.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did you want to cover usize/isize too?

Those are covered in #2200.

The purpose of the existing `layout.primitive.align` rule is to state
that the alignment of primitives is platform-specific.  Adding a
separate alignment guarantee for integers overloads this a bit.  Let's
instead separate out the rules; we'll rename the existing rule since
there are now two rules speaking to alignment.
Let's make this wording a bit more clear, and let's fix the em dash to
use `---` since that's what our renderer expects.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

disposition-merge I-lang-nominated Nominated for discussion during a lang team meeting. I-lang-radar Items that are on lang's radar and will need eventual work or consideration. P-lang-drag-1 Lang team prioritization drag level 1. proposed-final-comment-period S-waiting-on-review Status: The marked PR is awaiting review from a maintainer T-lang Relevant to the language team.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants